package com.jqq.threaduse.syn;

/**
 * @author 姬倩倩
 * @version 1.0
 * 模拟线程死锁
 */
public class DeadLock_ {
    public static void main(String[] args) {
        DeadLockDemo A = new DeadLockDemo(true);
        A.setName("A线程");
        DeadLockDemo B = new DeadLockDemo(false);
        B.setName("B线程");
        A.start();
        B.start();
    }
}
//线程
class DeadLockDemo extends Thread{
    static Object o1 = new Object();//保证多线程共享一个对象，这里使用static
    static Object o2 = new Object();
    boolean flag;

    public DeadLockDemo(boolean flag) {//构造器
        this.flag = flag;
    }

    @Override
    public void run() {
        //1.如果flag为T, 线程A会先得到o1对象锁，然后去尝试获取o2对象锁
        //2.如果线程A得不到o2对象锁，就会Blocked
        if(flag) {
            synchronized (o1) {//对象互斥锁，下面就是同步代码
                System.out.println(Thread.currentThread().getName() + "进入1");
                synchronized (o2) {
                    System.out.println(Thread.currentThread().getName() + "进入2");
                }
            }
        //3.如果flag为F, 线程B会先得到o2对象锁，然后去尝试获取o1对象锁
        //4.如果线程B得不到o1对象锁，就会Blocked
        }else{
            synchronized (o2){
                System.out.println(Thread.currentThread().getName()+"进入3");
                synchronized (o1){
                    System.out.println(Thread.currentThread().getName()+"进入4");
                }
            }
        }
        //所以线程A，B手里都拿着对方想要的锁，还不撒手，都在那Blocked，就会造成死锁
        //A线程进入1
        //B线程进入3
        //卡在这了。。。
    }
}